package com.hunit.mqtt_dome.service.impl;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hunit.mqtt_dome.emqx.MqttAcceptClient;
import com.hunit.mqtt_dome.properties.MqttProperties;
import com.hunit.mqtt_dome.service.MqttMessageReceiveService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

/**
 * @Description : MQTT消息接收服务接口实现
 * @Author : Sherlock
 * @Date : 2023/8/1 17:40
 */
@Service
public class MqttMessageReceiveServiceImpl implements MqttMessageReceiveService {

    private static final Logger logger = LoggerFactory.getLogger(MqttMessageReceiveServiceImpl.class);

    @Autowired
    @Lazy
    private MqttAcceptClient mqttAcceptClient;

    @Autowired
    private MqttProperties mqttProperties;

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public boolean subscribe(String topic) {
        return subscribe(topic, mqttProperties.getQos());
    }

    @Override
    public boolean subscribe(String topic, int qos) {
        logger.info("订阅MQTT主题: {}, QoS: {}", topic, qos);
        boolean result = mqttAcceptClient.subscribe(topic, qos);
        if (result) {
            logger.info("主题订阅成功: {}", topic);
        } else {
            logger.error("主题订阅失败: {}", topic);
        }
        return result;
    }

    @Override
    public boolean unsubscribe(String topic) {
        logger.info("取消订阅MQTT主题: {}", topic);
        boolean result = mqttAcceptClient.unsubscribe(topic);
        if (result) {
            logger.info("取消订阅成功: {}", topic);
        } else {
            logger.error("取消订阅失败: {}", topic);
        }
        return result;
    }

    @Override
    public void processMessage(String topic, String message) {
        // 这里实现具体的业务逻辑
        // 根据不同的主题进行不同的处理
        logger.info("接收到MQTT消息，主题: {}, 内容: {}", topic, message);
        
        try {
            // 示例：解析JSON消息
            // 可以根据具体业务需求修改
            if (message.startsWith("{") && message.endsWith("}")) {
                // 假设消息是JSON格式的
                Object jsonObj = objectMapper.readValue(message, Object.class);
                logger.info("解析JSON消息成功: {}", jsonObj);
                
                // TODO: 根据主题和消息内容进行业务处理
                // 例如：保存到数据库、调用其他服务等
                processJsonMessage(topic, jsonObj);
            } else {
                // 非JSON格式的消息处理
                logger.info("接收到普通文本消息: {}", message);
                
                // TODO: 处理普通文本消息
                processTextMessage(topic, message);
            }
        } catch (Exception e) {
            logger.error("处理MQTT消息异常: {}", e.getMessage(), e);
        }
    }
    
    /**
     * 处理JSON格式消息
     * 
     * @param topic 主题
     * @param jsonObj JSON对象
     */
    private void processJsonMessage(String topic, Object jsonObj) {
        // TODO: 根据主题和JSON内容进行业务处理
        // 这里可以根据不同的主题进行不同的处理逻辑
        logger.info("处理JSON消息: 主题 - {}, 内容 - {}", topic, jsonObj);
    }
    
    /**
     * 处理文本格式消息
     * 
     * @param topic 主题
     * @param message 消息内容
     */
    private void processTextMessage(String topic, String message) {
        // TODO: 根据主题和文本内容进行业务处理
        // 这里可以根据不同的主题进行不同的处理逻辑
        logger.info("处理文本消息: 主题 - {}, 内容 - {}", topic, message);
    }
} 